#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QWidget>
#include <QFile>
#include <QByteArray>
#include <QDebug>
#include <QMessageBox>
#include <QImage>
#include <QLabel>
#include <QTcpSocket>
#include <QHostAddress>

#include "protocol.h"
#include "opewidget.h"



#define qcout qDebug()<<"---------["<<__FILE__ <<":"<< __LINE__<<"]-->"




QT_BEGIN_NAMESPACE
namespace Ui { class TcpClient; }
QT_END_NAMESPACE

class TcpClient : public QWidget
{
    Q_OBJECT

public:
    TcpClient(QWidget *parent = nullptr);
    ~TcpClient();

    void loadConfig();//加载IP和端口号配置文件

    //单例
    static TcpClient& getInstance();

public slots:
    //自定义槽函数, 信号处理函数, 当客户端连接服务器成功后, 这个槽函数来响应
    void showConnect();
    //接收服务器消息
    void recvMsg();

    //客户端处理注册请求回复
    void handleRegist_tcpsocket(const PDU* pdu);
    //客户端处理登录请求回复
    void handleLogin_tcpsocket(const PDU* pdu);
    //用户查询所有在线用户服务器回复的消息
    void handleAllOnline_tcpsocket(const PDU* pdu);
    //用户查询搜索的用户服务器回复的消息
    void handleSearchUsr_tcpsocket(const PDU* pdu);
    //用户添加好友服务器回复的消息
    void handleAddFriend_tcpsocket(const PDU* pdu);
    //服务器发来消息, 问是否同意添加好友
    void handleAddFriendRequest_tcpsocket(const PDU* pdu);
    //服务器发来消息, 对方同意
    void handleAddFriend_respond_agree_tcpsocket(const PDU* pdu);
    //服务器发来消息, 对方拒绝
    void handleAddFriend_respond_refuse_tcpsocket(const PDU* pdu);

    //响应Friend类的槽函数
    //按钮m_pShowOnlineUsrPB
    void slot_sendToServerPB_m_pShowOnlineUsrPB();
    //按钮m_pSearchUsrPB
    void slot_sendToServerPB_m_pSearchUsrPB(QString text);

    //响应MsgAdd界面类的槽函数
    //把reply传给服务器, 告诉服务器添加好友的结果, 添加还是不添加
    void slot_sendToServerPB_m_pMsgAddUsrPB(QString fName, int reply);

    //响应Online类的槽函数
    //按钮pb_addfriend
    void slot_sendToServerPB_pb_addfriendPB(QString selectName);


    //获取自己的登录名
    QString getmloginName();



private slots:
    void on_send_pb_clicked();

    void on_pb_login_clicked();

    void on_pb_regist_clicked();

    void on_pb_cancel_clicked();


signals:
    //TcpClient向OpeWidget发送信号,由按钮m_pShowOnlineUsrPB触发, 要求OpeWidget输出日志信息
    void signal_slot_sendToServerPB_m_pShowOnlineUsrPB();

    //TcpClient向OpeWidget发送信号,由按钮m_pSearchUsrPB触发, 要求OpeWidget输出日志信息
    void signal_slot_sendToServerPB_m_pSearchUsrPB();



private:
    Ui::TcpClient *ui;

    QString m_strIP;
    quint16 m_usPort;//端口号, 无符号短整型

    QTcpSocket m_tcpSocket;//添加socket对象, 连接服务器, 和服务器进行数据交互
    QString m_loginName;//自己的登录名

    Friend* f;
};
#endif // TCPCLIENT_H
